﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Program
{
    class Teste
    {
        public static void Mostrar(Propriedade prop)
        {
            System.Console.WriteLine(prop.Nome);
     
            System.Console.WriteLine(prop.Passivo);
        }

        public class Pilha
        {
            int posicao;
            object[] dados = new object[10];
            public void Push(object obj) { dados[posicao++] = obj; }
            public object Pop()
            {
                return dados[--posicao];
            }

        }



        static void Main(string[] args)
        {
            Console.WriteLine("Exemplo1");
            Accoes ctt = new Accoes
            {
                Nome = "CTT",
                NumeroAccoes = 1000
            };
            Console.WriteLine(ctt.Nome);
            Console.WriteLine(ctt.NumeroAccoes);


            Console.WriteLine();
            Console.WriteLine("Exemplo2");

            Accoes ctt1 = new Accoes
            {
                Nome = "CTT",
                NumeroAccoes = 1000
            };

            Casa mansao = new Casa
            {
                Nome = "Mansao",
                Hipoteca = 1000
            };

            Mostrar(ctt1); Mostrar(mansao);


            Console.WriteLine();
            Console.WriteLine("Exemplo3");
            //upcasting
            Accoes ctt2 = new Accoes();
            Propriedade p = ctt2;
            //downcasting
            Accoes a = (Accoes)p;
            if (p is Accoes)
                ((Accoes)p).NumeroAccoes = 99999;
            Console.WriteLine(a.NumeroAccoes);

            Console.WriteLine();
            Console.WriteLine("Exemplo4");

            Pilha p1 = new Pilha();
            p1.Push("prato");
            string s = (string) p1.Pop();
            Console.WriteLine(s);


            Console.WriteLine();
            Console.WriteLine("Exemplo5");
            ContagemDecrescente cd = new ContagemDecrescente();
            Console.WriteLine(cd.Curret);
            cd.MoveNext();
            Console.WriteLine(cd.Curret);
            cd.MoveNext();
            Console.WriteLine(cd.Curret);


            Console.WriteLine();
            Console.WriteLine("Exemplo6");
            TabelasSimples();

            Console.WriteLine();
            Console.WriteLine("Exemplo7");
            ArrayInitialization();

            Console.WriteLine();
            Console.WriteLine("Exemplo8");
            DeclareImplicitArrays();


            Console.WriteLine();
            Console.WriteLine("Exemplo9");
            TipoEmpregado emp = TipoEmpregado.Informatico;
            PedirBonus(emp);


            Console.ReadLine();
        }

        static void TabelasSimples()
        {
            int[] A = new int[10];
            for (int i = 0; i < A.Length; i++)
                A[i] = i * i;
            for (int i = 0; i < A.Length; i++)
                Console.WriteLine(A[i]);
        }

        static void ArrayInitialization()
        {
            Console.WriteLine("=> Array Initialization.");
            string[] stringArray = new string[] { "one", "two", "three" };
            Console.WriteLine("stringArray has {0} elements", stringArray.Length);
            bool[] boolArray = { false, false, true };
            Console.WriteLine("boolArray has {0} elements", boolArray.Length);
            int[] intArray = new int[4] { 20, 22, 23, 0 };
             Console.WriteLine("intArray has {0} elements", intArray.Length);
            Console.WriteLine();
        }

        static void DeclareImplicitArrays()
        {
            Console.WriteLine("=> Implicit Array Initialization");
            //a is really int [].
            var a = new[] { 1, 10, 100, 1000 };
            Console.WriteLine("a is a: {0}", a.ToString());
            //b is really int [].
            var b = new[] { 1, 1.5, 2, 2.5 };
            Console.WriteLine("b is a: {0}", b.ToString());
            //c is really int [].
            var c = new[] { "hello", null, "world"};
            Console.WriteLine("c is a: {0}", c.ToString());
            Console.WriteLine();
        }

        static void PedirBonus(TipoEmpregado e)
        {
            switch (e)
            {
                case TipoEmpregado.Gerente:
                    Console.WriteLine("quanto posso sacar?");
                    break;
                case TipoEmpregado.Empregado:
                    Console.WriteLine("infelizmente pouco...");
                    break;
                case TipoEmpregado.Informatico:
                    Console.WriteLine("Sempre a faturar...");
                    break;
            }
        }


    }
}
